package com.macro.mall.service;


import com.macro.mall.common.api.CommonPage;
import com.macro.mall.dto.XhsOrderDetailVO;
import com.macro.mall.dto.XhsOrderQueryParam;
import com.macro.mall.dto.XhsOrderVO;
import com.macro.mall.model.XhsOrder;
import com.macro.mall.model.request.*;
import com.macro.mall.model.request.order.CreateOrderRequest;
import com.macro.mall.model.request.order.SelOrderRequest;
import com.macro.mall.model.request.order.StoreDetailRequest;
import com.macro.mall.model.response.*;
import com.macro.mall.model.vo.order.OrderDetail;
import com.macro.mall.model.vo.order.OrderList;
import com.macro.mall.model.vo.store.StoreDetailVo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * 小红书订单服务接口
 */
public interface XhsOrderService {

    /**
     * 凭证核销
     * @param request 包含外部订单ID、门店ID和券信息的请求参数
     * @return 核销结果，包含核销状态和相关信息
     * @throws Exception 核销过程中可能抛出的异常
     */
    VoucherVerifyResponse verifyVoucher(VoucherVerifyRequest request) throws Exception;

    /**
     * 新增/更新担保支付订单
     * @param request 订单请求参数
     * @return 订单响应结果
     */
    OrderUpsertResponse upsertOrder(OrderUpsertRequest request);


    /**
     * 创建订单
     */
    OrderUpsertResponse createOrder(CreateOrderRequest request);

    /**
     * 根据ID获取订单
     */
    XhsOrder getOrderById(Long id);

    /**
     * 根据外部订单ID获取订单
     */
    XhsOrder getOrderByOutOrderId(String outOrderId);



    /**
     * 根据券码查询外部订单
     */
    String getOutOrderByVoucherCode(String voucherCode);

    /**
     * 根据小红书订单ID获取订单
     */
    XhsOrder getOrderByXhsOrderId(String xhsOrderId);

    /**
     * 获取用户订单列表
     */
    List<XhsOrder> getUserOrders(String openId);

    /**
     * 更新订单状态
     */
    boolean updateOrderStatus(Long id, Integer orderStatus);

    /**
     * 更新支付信息
     */
    boolean updatePayInfo(Long id, String xhsOrderId, Integer payChannel,
                          String payToken, Date payTime, Date payExpiredTime);

    /**
     * 更新回调状态
     */
    boolean updateCallbackStatus(Long id, Integer callbackStatus);

    /**
     * 分页查询订单
     */
    List<XhsOrder> getOrderList(Date startTime, Date endTime, Integer orderStatus,
                                Integer pageNum, Integer pageSize);

    /**
     * 获取订单总数
     */
    int countOrderList(Date startTime, Date endTime, Integer orderStatus);


    /**
     * 查询小红书订单列表
     * @param request
     * @return
     */
    List<OrderList> selXhsOrder(SelOrderRequest request);



    XhsGpayOrderQueryResponse queryGpayOrder(XhsGpayOrderQueryRequest request) throws Exception;

    /**
     * 获取订单详情
     * @param request
     * @return
     */
    OrderDetail getOrderInfo(XhsGpayOrderQueryRequest request);

    /**
     * 通过 code 获取 session 信息
     * @param request 包含 code 的请求
     * @return 包含 openid 和 session_key 的响应
     */
    Code2SessionResponse code2Session(Code2SessionRequest request);


    /**
     * 根据手机号获取门店详情
     * @param storeDetailRequest
     * @return
     */
    StoreDetailVo getStoreDetail(StoreDetailRequest storeDetailRequest);

    /**
     * 核销完成后修改订单状态以及信息
     * @param request
     */
    void updateOrder(VoucherVerifyRequest request);

    /**
     * 获取小红书预授权码
     * @return
     */
    XhsPreAuthCodeResponse getPreAuthCode();








    /**
     * 根据券码列表查询核销信息
     */
    CouponVerifyResponseDTO getByCouponCodes(List<String> couponCodes);

    /**
     * 根据订单列表查询核销信息
     */
    CouponVerifyResponseDTO getByOrderIds( List<String> orderIds);

    /**
     * 综合查询核销信息
     */
    CouponVerifyResponseDTO getVerifyDetail(List<String> couponCodes, List<String> orderIds);
    
    // ========== 新增方法：订单列表管理 ==========
    
    /**
     * 分页查询订单列表
     * @param queryParam 查询参数
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    CommonPage<XhsOrderVO> getOrderList(XhsOrderQueryParam queryParam, Integer pageNum, Integer pageSize);
    
    /**
     * 获取订单详情
     * @param id 订单ID
     * @return 订单详情
     */
    XhsOrderDetailVO getOrderDetail(Long id);
    
    /**
     * 批量删除订单
     * @param ids 订单ID列表
     * @return 操作结果
     */
    boolean batchDeleteOrders(List<Long> ids);
    
    /**
     * 批量关闭订单
     * @param ids 订单ID列表
     * @param reason 关闭原因
     * @return 操作结果
     */
    boolean batchCloseOrders(List<Long> ids, String reason);
    
    /**
     * 判断订单是否过期
     * @param order 订单对象
     * @return 是否过期
     */
    boolean isOrderExpired(XhsOrder order);
    
    /**
     * 判断订单是否过期（根据过期时间）
     * @param orderExpiredTime 订单过期时间
     * @return 是否过期
     */
    boolean isOrderExpired(Date orderExpiredTime);
    
    /**
     * 获取订单可用操作列表
     * @param orderStatus 订单状态
     * @param isExpired 是否过期
     * @return 可用操作列表
     */
    List<String> getAvailableActions(Integer orderStatus, Boolean isExpired);
}
